<?php

/**
 * 
 * 获取 $_GET 传送的数据
 * @param string $parameter_name 参数名
 * @param string $default_value 默认值
 * @param string $convert_type 转换为指定类型
 * @param bool $escape 是否过滤非法字符， 防止SQL注入
 * @return string
 */
function get($parameter_name = null, $default_value = null, $convert_type = 'string', $escape = true)
{
    return request($parameter_name, $default_value, 'get', $convert_type, $escape);
}

/**
 * 
 * 获取 $_POST 传送的数据
 * @param string $parameter_name 参数名
 * @param string $default_value 默认值
 * @param string $convert_type 转换为指定类型
 * @param bool $escape 是否过滤非法字符， 防止SQL注入
 * @return string
 */
function post($parameter_name = null, $default_value = null, $convert_type = 'string', $escape = true)
{
    return request($parameter_name, $default_value, 'post', $convert_type, $escape);
}

/**
 * 
 * 获取 $_COOKIE 传送的数据
 * @param string $parameter_name 参数名
 * @param string $default_value 默认值
 * @param string $convert_type 转换为指定类型
 * @param bool $escape 是否过滤非法字符， 防止SQL注入
 * @return string
 */
function cookie($parameter_name, $default_value = null, $convert_type = 'string', $escape = true)
{
    return request($parameter_name, $default_value, 'cookie', $convert_type, $escape);
}

/**
 * 
 * 获取 $_GET/$_POST/$_COOKIE 传送的数据
 * 
 * @param string $parameter_name
 * @param string $default_value 没有取到值时，默认返回值
 * @param string $method 按哪种方法传值  get/post/cookie
 * @param string $convert_type 取到的值进行类型转换   
 * $convert_type可选参数:
 * int: 整型
 * float：浮点型
 * string: 字符串
 * array(int):整型数组
 * array(float):浮点型数组
 * array(string):字符串数组
 * @param string $escape 是否需要在某些字符前加上了反斜线。这些字符是单引号（'）、双引号（"）、反斜线（\）与 NUL（NULL 字符）防止数据库查询或写入时出错或SQL注入。
 * @return string
 */
function request($parameter_name = null, $default_value = null, $method = 'request', $convert_type = 'string', $escape = true)
{
    switch ($method)
    {
        case 'get':
            $input = $_GET;
            break;
        case 'post':
            $input = $_POST;
            break;
        case 'cookie':
            $input = $_COOKIE;
            break;
        default:
            $input = $_REQUEST;
            break;
    }
    
    if ($parameter_name === null)
    {
        if (!get_magic_quotes_gpc()) $input = array_map('addslashes', $input);
        return $input;
    }
    
    $value = $default_value;
    
    if (isset($input[$parameter_name]) && $input[$parameter_name] !== null)
    {
        $value = $input[$parameter_name];
        switch ($convert_type)
        {
            case 'int':
                $value = intval($value);
                break;
            case 'float':
                $value = floatval($value);
                break;
            case 'string':
                if (is_string($value))
                {
                    $value = trim($value);
                    if ($escape)
                    {
                        if (!get_magic_quotes_gpc()) $value = addslashes($value);
                    }
                    else
                    {
                        if (get_magic_quotes_gpc()) $value = stripslashes($value);
                    }
                }
                else
                {
                    $value = $default_value;
                }
                break;
            case 'array(int)':
                $array = array();
                if (is_array($value))
                {
                    foreach ($value as $key => $val)
                    {
                        $array[$key] = intval($val);
                    }
                }
                $value = $array;
                break;
            case 'array(float)':
                $array = array();
                if (is_array($value))
                {
                    foreach ($value as $key => $val)
                    {
                        $array[$key] = floatval($val);
                    }
                }
                $value = $array;
                break;
            case 'array(string)':
                $array = array();
                if (is_array($value))
                {
                    foreach ($value as $key => $val)
                    {
                        if (is_string($val))
                        {
                            $val = trim($val);
                            if ($escape)
                            {
                                if (!get_magic_quotes_gpc()) $val = addslashes($val);
                            }
                            else
                            {
                                if (get_magic_quotes_gpc()) $val = stripslashes($val);
                            }
                        }
                        else
                        {
                            $val = $default_value;
                        }
                        $array[$key] = $val;
                    }
                }
                $value = $array;
                break;
        }
    }
    return $value;
}

/**
 * 
 * 处理网址
 * 
 * @param string $url 要处理的网址，启用 SEF 时生成伪静态页， 为空时返回网站网址
 */
function url($url = null)
{
    if ($url === null) return BONE_URL;
    
    $url = BONE_URL . $url;
    
    $config = bone::get_config('system');
    if ($config->sef == '1')
    {
        $pos = strpos($url, '?');
        if ($pos !== false)
        {
            $url = str_replace('index.php?', '?', $url);
            
            $root = substr($url, 0, $pos);
            $url = substr($url, $pos);
            $url = str_replace(array('index.php?app=', '?app='), '', $url);
            $url = str_replace(array('.', '=', '&'), '-', $url) . '.html';
        
     //$url = preg_replace( "/.+?_-([^-]+)-controller-([^-]+)-task-([^-]+)(.+)/", "\\1-\\2\\3", $url ).'.html';
        }
    }
    
    return $url;
}

/**
 * 
 * 多国语言
 * @param string $text 要翻译的文字
 * 
 * @todo 当前使用的版本不支持
 */
function lang($text = null)
{
    return $text;
}

/**
 * 
 * 限制字符串宽度
 * 名词说明
 * 字符: 一个字符占用一个字节， strlen 长度为 1
 * 文字：(可以看成由多个字符组成) 占用一个或多个字节  strlen 长度可能为 1,2,3,4,5,6
 * 
 * @param string $string 要限制的字符串
 * @param int $length 限制的宽度
 * @param string $etc 结层符号
 * @return string
 */
function limit($string, $length = 50, $etc = '...')
{
    $string = strip_tags($string);
    $length *= 2; //按中文时宽度应加倍
    

    if (strlen($string) <= $length) return $string;
    
    $length -= strlen($etc); // 去除结尾符长度
    if ($length <= 0) return '';
    
    $strlen = strlen($string);
    
    $pos = 0; // 当前处理到的字符位置
    $last_len = 0; // 最后一次处理的字符所代表的文字的宽度
    $len = 0; // 文字宽度累加值
    

    while ($pos < $strlen) // 骨头系统采用了utf-8编码， 逐字符判断
    {
        $char = ord($string[$pos]);
        if ($char == 9 || $char == 10 || (32 <= $char && $char <= 126))
        {
            $last_len = 1;
            $pos++;
            $len++;
        }
        elseif (192 <= $char && $char <= 223)
        {
            $last_len = 2;
            $pos += 2;
            $len += 2;
        }
        elseif (224 <= $char && $char <= 239)
        {
            $last_len = 3;
            $pos += 3;
            $len += 2;
        }
        elseif (240 <= $char && $char <= 247)
        {
            $last_len = 4;
            $pos += 4;
            $len += 2;
        }
        elseif (248 <= $char && $char <= 251)
        {
            $last_len = 5;
            $pos += 5;
            $len += 2;
        }
        elseif ($char == 252 || $char == 253)
        {
            $last_len = 6;
            $pos += 6;
            $len += 2;
        }
        else
        {
            $pos++;
        }
        
        if ($len >= $length) break;
    }
    
    // 超过指定宽度， 减去最后一次处理的字符所代表的文字宽度
    if ($len >= $length)
    {
        $pos -= $last_len;
        $string = substr($string, 0, $pos);
        $string .= $etc;
    }
    
    return $string;
}

